#include "Blockqueue.hpp"
#include "Task.hpp"

char ops[5] = {'+','-','*','/','%'};

void* Consumer(void* args)
{
	Blockqueue<Task>* bq = static_cast<Blockqueue<Task>*>(args);
	// Blockqueue<int>* bq = static_cast<Blockqueue<int>*>(args);

	while(true)
	{
		// int data = bq->pop();
		// cout << "消费一个数据 : " << data << endl;
		Task d = bq->pop();
		d();
		cout << "消费一个数据 : " << d.Getresult() << endl;
		sleep(1);
	}
}

void* Productor(void* args)
{
	Blockqueue<Task>* bq = static_cast<Blockqueue<Task>*>(args);
	// Blockqueue<int>* bq = static_cast<Blockqueue<int>*>(args);
	// int data = 0;

	while(true)
	{
		// data++;
		usleep(100);
		int data1 = rand() % 10 + 1;
		int data2 = rand() % 10 + 1;
		char op = ops[rand()%5];
		Task t(data1,data2,op);
		// bq->push(data);
		bq->push(t);
		// cout << "生产一个数据 : " << data << endl;
		cout << "生产一个任务 : " << t.GetTask() << endl;
		// sleep(1);
	}

}

int main()
{
	srand(time(nullptr));
	pthread_t c[5],p[3];
	Blockqueue<Task>* bq = new Blockqueue<Task>();

	for(int i = 0;i < 5;i++){
		pthread_create(c+i,nullptr,Consumer,bq);
	}
	for(int j = 0;j < 3;j++){
		pthread_create(p+j,nullptr,Productor,bq);
	}
	// pthread_create(&c,nullptr,Consumer,bq);
	// pthread_create(&p,nullptr,Productor,bq);

	for(int i = 0;i < 5;i++){
		pthread_join(c[i],nullptr);
	}
	for(int j = 0;j < 3;j++){
		pthread_join(p[j],nullptr);
	}
	// pthread_join(c,nullptr);
	// pthread_join(p,nullptr);

	return 0;
}
